package net.siufung.security.api.context;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.ttl.TransmittableThreadLocal;
import net.siufung.core.model.consts.Constants;

import java.util.Optional;

/**
 * 当前用户上下文
 * @author 陈建峰
 * @since 2022/2/9 11:10 下午
 */
public class UserContextHolder {
	
	/**
     * 线程安全 ThreadLocal
     */
	private final TransmittableThreadLocal<JSONObject> threadLocal;

    /**
     * 静态内部类单例模式 单例初使化
     */
    private static final UserContextHolder INSTANCE = new UserContextHolder();

    /**
     * 构造函数
     */
    private UserContextHolder() {
        this.threadLocal = new TransmittableThreadLocal<>();
    }
    
    /**
     * 创建实例
     * @return UserContextHolder
     */
    public static UserContextHolder getInstance() {
        return UserContextHolder.INSTANCE;
    }

    /**
     * 用户上下文中放入信息
     * @param currentUserContext 当前用户上下文
     */
    public void setContext(JSONObject currentUserContext) {
        threadLocal.set(currentUserContext);
    }

    /**
     * 获取上下文中的信息
     * @return JSONObject 用户JSON对象
     */
    public JSONObject getContext() {
        return threadLocal.get();
    }
    
    /**
     * 清空上下文
     */
    public void clear() {
        threadLocal.remove();
    }

    /**
     * 获取上下文中的用户名
     * @return 当前用户名
     */
    public String getUsername() {
        return Optional.ofNullable(getContext()).orElse(new JSONObject()).getString("user_name");
    }
    
    /**
     * 获得上下文用户信息
     * @return JSONObject
     */
    public JSONObject currentUser(){
        return  JSONObject.parseObject(
                        Optional.ofNullable(getContext()).orElse(new JSONObject()).getString(Constants.AUTH_CONTEXT_USER_KEY));
    }


    
    

	
}
